#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	//char* p = "abcdef";//把常量字符串首字母的地址赋给p
	//char arr[] = "abcdef";
	//printf("%p\n", "abcdef");
	//printf("%s\n", arr);
	//printf("%p\n", p);//相当于%d，常量
	//printf("%c\n", *p);
	//printf("%s\n", p);

	//指针数组，数组中的每一个元素都是指针，或者说数组中的每一个
    //元素都是地址
	//char* arr[4] = {"abcdef","dfe","fgh","opi"};
	//int i = 0;
	//for (i = 0; i < 4; i++)
	//{
	//	printf("%p\n", arr[i]);
	//	printf("%s\n", arr[i]);
	//}

	//int arr1[4] = {1,2,3,4};
	//int arr2[4] = {2,3,4,5};
	//int arr3[4] = {3,4,5,6};
	//int arr4[4] = {4,5,6,7};
	//int* arr[4] = {arr1,arr2,arr3,arr4};
	//int i = 0;
	//for (i=0;i<4;i++)
	//{
	//	printf("%p\n", arr[i]);
	//	printf("%d\n", arr[i][1]);
	//	printf("%d\n", *(arr[i]+1));
	//}

	//int* arr[10];// arr先与方括号结合，是数组，指针数组，数组里有10个元素，每一个元素都是int*
	//int(*arr)[10];//arr先与*结合，是一个指针，指针指向一个10个元素的数组，数组中的每一个元素都是int
	
	//数组指针的类型 首先他是一个指针，这个指针指向一个10个元素的数组，数组内的每一个元素都是整型
	//int （*）[10]
				  
	//数组名，是数组首元素的地址
	//&数组名，是数组的地址
	//两者从数值的角度来看是一样的



	//int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	//int(*p)[10] = &arr;
	//int i = 0;
	//for (i = 0; i < 10; i++)
	//{
	//	//*p代表整个数组，对数组通过下标来寻找元素
	//	printf("%d ", (*p)[i]);
	//}

	//通过数组指针来实现二维数组的打印
	int arr[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6};
	//对于二维数组来说，其数组名是每行的一维数组的地址，也就是说他是整个一维数组的地址
	//可以将它赋值给一个数组指针。这个指针所指向的数组中有4个元素，每一个元素都是整型
	int i = 0;
	int(*p)[4] = arr;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j=0;j<4;j++)
		{
			printf("%d ", (*(p+i))[j]);
		}
		printf("\n");
	}
	//数组的类型为去掉数组名
	int arr[10];
	//他的类型为int [10]
	int(*arr[10])[5]//是一个数组，共有10个元素，把arr[10]拿掉剩下int(*)[5]，是每一个
					//元素的类型  存放数组指针的数组

		int* arr2[10];//指针数组，数组中有10个元素每一个元素都是
	                  //int*
		return 0;
}